home *** CD-ROM | disk | FTP | other *** search
/ Programmer Power Tools / Programmer Power Tools.iso / editor / j414src.arc / FUNCDEFS.C < prev    next >
C/C++ Source or Header  |  1989-10-10  |  16KB  |  426 lines

  1. /***************************************************************************
  2.  * This program is Copyright (C) 1986, 1987, 1988 by Jonathan Payne.  JOVE *
  3.  * is provided to you without charge, and with no warranty.  You may give  *
  4.  * away copies of JOVE, including sources, provided that this notice is    *
  5.  * included in all the files.                                              *
  6.  ***************************************************************************/
  7.  
  8. #include "jove.h"
  9. #include "ctype.h"
  10.  
  11. #if !defined(MSDOS) && !defined(SYSV) && !defined(MAC)
  12. # include <sgtty.h>
  13. #endif
  14.  
  15. #if !defined(TXT_TO_C)
  16.  
  17. #if defined(MAC)
  18. #    define WIRED_CMD(c) (c),'\0','\0'    /* for About Jove... */
  19. #else
  20. #    define WIRED_CMD(c)    (c)
  21. #endif /* MAC */
  22.  
  23. #else /* TXT_TO_C */
  24.  
  25. #if defined(MAC)
  26. #    define WIRED_CMD(c) 0,'\0','\0'
  27. #else
  28. #    define WIRED_CMD(c)    0
  29. #endif
  30. #endif /* TXT_TO_C */
  31.  
  32. const struct cmd    commands[] = {
  33. #if defined(LISP)
  34.     FUNCTION, "add-lisp-special", WIRED_CMD(AddSpecial),
  35. #endif
  36.     FUNCTION, "append-region", WIRED_CMD(AppReg),
  37.     FUNCTION, "apropos", WIRED_CMD(Apropos),
  38.     FUNCTION, "auto-execute-command", WIRED_CMD(CAutoExec),
  39.     FUNCTION, "auto-execute-macro", WIRED_CMD(MAutoExec),
  40.     DefMinor(Fill), "auto-fill-mode", WIRED_CMD(0),
  41.     DefMinor(Indent), "auto-indent-mode", WIRED_CMD(0),
  42.     FUNCTION, "backward-character", WIRED_CMD(BackChar),
  43.     FUNCTION, "backward-list", WIRED_CMD(BList),
  44.     FUNCTION, "backward-paragraph", WIRED_CMD(BackPara),
  45.     FUNCTION, "backward-s-expression", WIRED_CMD(BSexpr),
  46.     FUNCTION, "backward-sentence", WIRED_CMD(Bos),
  47.     FUNCTION, "backward-up-list", WIRED_CMD(BUpList),
  48.     FUNCTION, "backward-word", WIRED_CMD(BackWord),
  49.     FUNCTION, "begin-kbd-macro", WIRED_CMD(Remember),
  50.     FUNCTION, "beginning-of-file", WIRED_CMD(Bof),
  51.     FUNCTION, "beginning-of-line", WIRED_CMD(Bol),
  52.     FUNCTION, "beginning-of-window", WIRED_CMD(Bow),
  53.     FUNCTION, "bind-to-key", WIRED_CMD(BindAKey),
  54.     FUNCTION, "bind-keymap-to-key", WIRED_CMD(KmBind),
  55.     FUNCTION, "bind-macro-to-key", WIRED_CMD(BindMac),
  56. #if defined(ABBREV)
  57.     FUNCTION, "bind-macro-to-word-abbrev", WIRED_CMD(BindMtoW),
  58. #endif
  59.     FUNCTION, "buffer-position", WIRED_CMD(BufPos),
  60.     DefMajor(CMODE), "c-mode", WIRED_CMD(0),
  61.     MODFUNC, "case-character-capitalize", WIRED_CMD(CapChar),
  62.     MODFUNC, "case-region-lower", WIRED_CMD(CasRegLower),
  63.     MODFUNC, "case-region-upper", WIRED_CMD(CasRegUpper),
  64.     MODFUNC, "case-word-capitalize", WIRED_CMD(CapWord),
  65.     MODFUNC, "case-word-lower", WIRED_CMD(LowWord),
  66.     MODFUNC, "case-word-upper", WIRED_CMD(UppWord),
  67.     MODFUNC, "character-to-octal-insert", WIRED_CMD(ChrToOct),
  68.     FUNCTION, "cd", WIRED_CMD(Chdir),
  69.     FUNCTION, "clear-and-redraw", WIRED_CMD(ClAndRedraw),
  70. #if !defined(MAC)
  71.     FUNCTION, "compile-it", WIRED_CMD(MakeErrors),
  72. #endif
  73. #if defined(IPROCS) && !defined(PIPEPROCS) && defined(TIOCSLTC)
  74.     FUNCTION, "continue-process", WIRED_CMD(ProcCont),
  75. #endif
  76.     FUNCTION, "copy-region", WIRED_CMD(CopyRegion),
  77. #if !defined(MAC)
  78.     FUNCTION, "current-error", WIRED_CMD(ShowErr),
  79. #endif
  80.     FUNCTION, "date", WIRED_CMD(prCTIME),
  81. #if defined(IPROCS)
  82.     FUNCTION, "process-dbx-output", WIRED_CMD(DBXpoutput),
  83. #endif
  84. #if defined(ABBREV)
  85.     FUNCTION, "define-global-word-abbrev", WIRED_CMD(DefGAbbrev),
  86.     FUNCTION, "define-mode-word-abbrev", WIRED_CMD(DefMAbbrev),
  87. #endif
  88.     FUNCTION, "define-macro", WIRED_CMD(DefKBDMac),
  89.     MODFUNC, "delete-blank-lines", WIRED_CMD(DelBlnkLines),
  90.     FUNCTION, "delete-buffer", WIRED_CMD(BufKill),
  91.     FUNCTION, "delete-macro", WIRED_CMD(DelMacro),
  92.     MODFUNC, "delete-next-character", WIRED_CMD(DelNChar),
  93.     FUNCTION, "delete-other-windows", WIRED_CMD(OneWindow),
  94.     MODFUNC, "delete-previous-character", WIRED_CMD(DelPChar),
  95.     MODFUNC, "delete-white-space", WIRED_CMD(DelWtSpace),
  96.     FUNCTION, "delete-current-window", WIRED_CMD(DelCurWindow),
  97.     FUNCTION, "describe-bindings", WIRED_CMD(DescBindings),
  98.     FUNCTION, "describe-command", WIRED_CMD(DescCom),
  99.     FUNCTION, "describe-key", WIRED_CMD(KeyDesc),
  100.     FUNCTION, "describe-variable", WIRED_CMD(DescCom),
  101.     FUNCTION, "digit", WIRED_CMD(Digit),
  102.     FUNCTION, "digit-1", WIRED_CMD(Digit1),
  103.     FUNCTION, "digit-2", WIRED_CMD(Digit2),
  104.     FUNCTION, "digit-3", WIRED_CMD(Digit3),
  105.     FUNCTION, "digit-4", WIRED_CMD(Digit4),
  106.     FUNCTION, "digit-5", WIRED_CMD(Digit5),
  107.     FUNCTION, "digit-6", WIRED_CMD(Digit6),
  108.     FUNCTION, "digit-7", WIRED_CMD(Digit7),
  109.     FUNCTION, "digit-8", WIRED_CMD(Digit8),
  110.     FUNCTION, "digit-9", WIRED_CMD(Digit9),
  111.     FUNCTION, "digit-0", WIRED_CMD(Digit0),
  112.     FUNCTION, "dirs", WIRED_CMD(prDIRS),
  113.     FUNCTION, "down-list", WIRED_CMD(FDownList),
  114. #if defined(IPROCS) && !defined(PIPEPROCS) && defined(TIOCSLTC)
  115.     FUNCTION, "dstop-process", WIRED_CMD(ProcDStop),
  116. #endif
  117. #if defined(ABBREV)
  118.     FUNCTION, "edit-word-abbrevs", WIRED_CMD(EditAbbrevs),
  119. #endif
  120.     FUNCTION, "end-kbd-macro", WIRED_CMD(Forget),
  121.     FUNCTION, "end-of-file", WIRED_CMD(Eof),
  122.     FUNCTION, "end-of-line", WIRED_CMD(Eol),
  123.     FUNCTION, "end-of-window", WIRED_CMD(Eow),
  124. #if defined(IPROCS) && !defined(PIPEPROCS)
  125.     FUNCTION, "eof-process", WIRED_CMD(ProcEof),
  126. #endif
  127.     FUNCTION, "erase-buffer", WIRED_CMD(BufErase),
  128.     FUNCTION, "exchange-point-and-mark", WIRED_CMD(PtToMark),
  129.     FUNCTION, "execute-named-command", WIRED_CMD(Extend),
  130.     FUNCTION, "execute-kbd-macro", WIRED_CMD(ExecMacro),
  131.     FUNCTION, "execute-macro", WIRED_CMD(RunMacro),
  132.     FUNCTION, "exit-jove", WIRED_CMD(Leave),
  133. #if defined(CMT_FMT)
  134.     MODFUNC, "fill-comment", WIRED_CMD(Comment),
  135. #endif /* CMT_FMT */
  136.     MODFUNC, "fill-paragraph", WIRED_CMD(Justify),
  137.     MODFUNC, "fill-region", WIRED_CMD(RegJustify),
  138. #if !defined(MAC)
  139.     MODFUNC, "filter-region", WIRED_CMD(FilterRegion),
  140. #endif
  141.     FUNCTION, "find-file", WIRED_CMD(FindFile),
  142.     FUNCTION, "find-tag", WIRED_CMD(FindTag),
  143.     FUNCTION, "find-tag-at-point", WIRED_CMD(FDotTag),
  144.     FUNCTION, "first-non-blank", WIRED_CMD(ToIndent),
  145.     FUNCTION, "forward-character", WIRED_CMD(ForChar),
  146.     FUNCTION, "forward-list", WIRED_CMD(FList),
  147.     FUNCTION, "forward-paragraph", WIRED_CMD(ForPara),
  148.     FUNCTION, "forward-s-expression", WIRED_CMD(FSexpr),
  149.     FUNCTION, "forward-sentence", WIRED_CMD(Eos),
  150.     FUNCTION, "forward-word", WIRED_CMD(ForWord),
  151.     DefMajor(FUNDAMENTAL), "fundamental-mode", WIRED_CMD(0),
  152.     FUNCTION, "gather-numeric-argument", WIRED_CMD(TimesFour),
  153. #if defined(LISP)
  154.     MODFUNC, "grind-s-expr", WIRED_CMD(GSexpr),
  155. #endif
  156.     FUNCTION, "goto-line", WIRED_CMD(GoLine),
  157.     FUNCTION, "goto-window-with-buffer", WIRED_CMD(GotoWind),
  158.     FUNCTION, "grow-window", WIRED_CMD(GrowWindow),
  159.     MODFUNC, "handle-tab", WIRED_CMD(Tab),
  160.     FUNCTION, "i-search-forward", WIRED_CMD(IncFSearch),
  161.     FUNCTION, "i-search-reverse", WIRED_CMD(IncRSearch),
  162.     MODFUNC, "insert-file", WIRED_CMD(InsFile),
  163. #if defined(IPROCS)
  164.     FUNCTION, "interrupt-process", WIRED_CMD(ProcInt),
  165.     FUNCTION, "i-shell-command", WIRED_CMD(Iprocess),
  166. #endif
  167.     MODFUNC, "kill-next-word", WIRED_CMD(DelNWord),
  168.     MODFUNC, "kill-previous-word", WIRED_CMD(DelPWord),
  169. #if defined(IPROCS)
  170.     FUNCTION, "kill-process", WIRED_CMD(ProcKill),
  171. #endif
  172.     MODFUNC, "kill-region", WIRED_CMD(DelReg),
  173.     MODFUNC, "kill-s-expression", WIRED_CMD(KillExpr),
  174.     FUNCTION, "kill-some-buffers", WIRED_CMD(KillSome),
  175.     MODFUNC, "kill-to-beginning-of-sentence", WIRED_CMD(KillBos),
  176.     MODFUNC, "kill-to-end-of-line", WIRED_CMD(KillEOL),
  177.     MODFUNC, "kill-to-end-of-sentence", WIRED_CMD(KillEos),
  178.     FUNCTION, "left-margin-here", WIRED_CMD(SetLMargin),
  179. #if defined(LISP)
  180.     DefMajor(LISPMODE), "lisp-mode", WIRED_CMD(0),
  181. #endif
  182.     FUNCTION, "list-buffers", WIRED_CMD(BufList),
  183. #if defined(IPROCS)
  184.     FUNCTION, "list-processes", WIRED_CMD(ProcList),
  185. #endif
  186.     FUNCTION, "make-buffer-unmodified", WIRED_CMD(NotModified),
  187.     FUNCTION, "make-keymap", WIRED_CMD(MakeKMap),
  188.     FUNCTION, "make-macro-interactive", WIRED_CMD(MacInter),
  189.     FUNCTION, "name-kbd-macro", WIRED_CMD(NameMac),
  190.     MODFUNC, "newline", WIRED_CMD(Newline),
  191.     MODFUNC, "newline-and-backup", WIRED_CMD(OpenLine),
  192.     MODFUNC, "newline-and-indent", WIRED_CMD(LineAI),
  193. #if !defined(MAC)
  194.     FUNCTION, "next-error", WIRED_CMD(NextError),
  195. #endif
  196.     FUNCTION, "next-line", WIRED_CMD(NextLine),
  197.     FUNCTION, "next-page", WIRED_CMD(NextPage),
  198.     FUNCTION, "next-window", WIRED_CMD(NextWindow),
  199.     FUNCTION, "number-lines-in-window", WIRED_CMD(WNumLines),
  200.     DefMinor(OverWrite), "over-write-mode", WIRED_CMD(0),
  201.     FUNCTION, "page-next-window", WIRED_CMD(PageNWind),
  202.     MODFUNC, "paren-flash", WIRED_CMD(DoParen),
  203. #if !defined(MAC)
  204.     FUNCTION, "parse-errors", WIRED_CMD(ErrParse),
  205. #endif
  206. #if defined(SPELL)
  207.     FUNCTION, "parse-spelling-errors-in-buffer", WIRED_CMD(SpelWords),
  208. #endif
  209. #if defined(JOB_CONTROL)
  210.     FUNCTION, "pause-jove", WIRED_CMD(PauseJove),
  211. #else
  212. #    ifndef MAC
  213.     FUNCTION, "pause-jove", WIRED_CMD(Push),
  214. #    endif
  215. #endif
  216.     FUNCTION, "pop-mark", WIRED_CMD(PopMark),
  217.     FUNCTION, "popd", WIRED_CMD(Popd),
  218. #if !defined(MAC)
  219.     FUNCTION, "previous-error", WIRED_CMD(PrevError),
  220. #endif
  221.     FUNCTION, "previous-line", WIRED_CMD(PrevLine),
  222.     FUNCTION, "previous-page", WIRED_CMD(PrevPage),
  223.     FUNCTION, "previous-window", WIRED_CMD(PrevWindow),
  224.     FUNCTION, "print", WIRED_CMD(PrVar),
  225. #if defined(IPROCS)
  226.     FUNCTION, "process-bind-keymap-to-key", WIRED_CMD(ProcKmBind),
  227.     FUNCTION, "process-bind-to-key", WIRED_CMD(ProcBind),
  228.     MODFUNC, "process-newline", WIRED_CMD(ProcNewline),
  229.     FUNCTION, "process-send-data-no-return", WIRED_CMD(ProcSendData),
  230. #endif
  231. #if !defined(MAC)
  232.     FUNCTION, "push-shell", WIRED_CMD(Push),
  233. #endif
  234.     FUNCTION, "pushd", WIRED_CMD(Pushd),
  235.     FUNCTION, "pwd", WIRED_CMD(prCWD),
  236.     MODFUNC, "query-replace-string", WIRED_CMD(QRepSearch),
  237. #if defined(IPROCS)
  238.     FUNCTION, "quit-process", WIRED_CMD(ProcQuit),
  239. #endif
  240.     MODFUNC, "quoted-insert", WIRED_CMD(QuotChar),
  241.     DefMinor(ReadOnly), "read-only-mode", WIRED_CMD(0),
  242. #if defined(ABBREV)
  243.     FUNCTION, "read-word-abbrev-file", WIRED_CMD(RestAbbrevs),
  244. #endif
  245.     FUNCTION, "redraw-display", WIRED_CMD(RedrawDisplay),
  246.     FUNCTION, "recursive-edit", WIRED_CMD(Recur),
  247.     FUNCTION, "rename-buffer", WIRED_CMD(ReNamBuf),
  248.     MODFUNC, "replace-in-region", WIRED_CMD(RegReplace),
  249.     MODFUNC, "replace-string", WIRED_CMD(RepSearch),
  250.     FUNCTION, "right-margin-here", WIRED_CMD(SetRMargin),
  251.     FUNCTION, "save-file", WIRED_CMD(SaveFile),
  252.     FUNCTION, "scroll-down", WIRED_CMD(DownScroll),
  253.     FUNCTION, "scroll-left", WIRED_CMD(ScrollLeft),
  254. #if defined(MSDOS)
  255.     FUNCTION, "scroll-next-page", WIRED_CMD(PageScrollUp),
  256.     FUNCTION, "scroll-previous-page", WIRED_CMD(PageScrollDown),
  257. #endif /* MSDOS */
  258.     FUNCTION, "scroll-right", WIRED_CMD(ScrollRight),
  259.     FUNCTION, "scroll-up", WIRED_CMD(UpScroll),
  260.     FUNCTION, "search-forward", WIRED_CMD(ForSearch),
  261.     FUNCTION, "search-forward-nd", WIRED_CMD(FSrchND),
  262.     FUNCTION, "search-reverse", WIRED_CMD(RevSearch),
  263.     FUNCTION, "search-reverse-nd", WIRED_CMD(RSrchND),
  264.     FUNCTION, "select-buffer", WIRED_CMD(BufSelect),
  265. #if defined(MSDOS)
  266.     FUNCTION, "select-buffer-1", WIRED_CMD(Buf1Select),
  267.     FUNCTION, "select-buffer-2", WIRED_CMD(Buf2Select),
  268.     FUNCTION, "select-buffer-3", WIRED_CMD(Buf3Select),
  269.     FUNCTION, "select-buffer-4", WIRED_CMD(Buf4Select),
  270.     FUNCTION, "select-buffer-5", WIRED_CMD(Buf5Select),
  271.     FUNCTION, "select-buffer-6", WIRED_CMD(Buf6Select),
  272.     FUNCTION, "select-buffer-7", WIRED_CMD(Buf7Select),
  273.     FUNCTION, "select-buffer-8", WIRED_CMD(Buf8Select),
  274.     FUNCTION, "select-buffer-9", WIRED_CMD(Buf9Select),
  275.     FUNCTION, "select-buffer-10", WIRED_CMD(Buf10Select),
  276. #endif /* MSDOS */
  277.     MODFUNC, "self-insert", WIRED_CMD(SelfInsert),
  278.     FUNCTION, "set", WIRED_CMD(SetVar),
  279.     FUNCTION, "set-mark", WIRED_CMD(SetMark),
  280. #if defined(IPROCS)    /* for GNU compatibility */
  281.     FUNCTION, "shell", WIRED_CMD(ShellProc),
  282. #endif
  283. #if !defined(MAC)
  284.     FUNCTION, "shell-command", WIRED_CMD(ShellCom),
  285.     FUNCTION, "shell-command-no-buffer", WIRED_CMD(ShNoBuf),
  286.     FUNCTION, "shell-command-to-buffer", WIRED_CMD(ShToBuf),
  287.     FUNCTION, "shell-command-with-typeout", WIRED_CMD(Shtypeout),
  288. #endif
  289.     MODFUNC, "shift-region-left", WIRED_CMD(LRShift),
  290.     MODFUNC, "shift-region-right", WIRED_CMD(RRShift),
  291.     DefMinor(ShowMatch), "show-match-mode", WIRED_CMD(0),
  292.     FUNCTION, "shrink-window", WIRED_CMD(ShrWindow),
  293.     FUNCTION, "source", WIRED_CMD(Source),
  294. #if defined(SPELL)
  295.     FUNCTION, "spell-buffer", WIRED_CMD(SpelBuffer),
  296. #endif
  297.     FUNCTION, "split-current-window", WIRED_CMD(SplitWind),
  298.     FUNCTION, "start-remembering", WIRED_CMD(Remember),
  299. #if defined(IPROCS) && !defined(PIPEPROCS)
  300.     FUNCTION, "stop-process", WIRED_CMD(ProcStop),
  301. #endif
  302.     FUNCTION, "stop-remembering", WIRED_CMD(Forget),
  303.     FUNCTION, "string-length", WIRED_CMD(StrLength),
  304. #if defined(JOB_CONTROL)
  305.     FUNCTION, "suspend-jove", WIRED_CMD(PauseJove),
  306. #endif
  307.     DefMajor(TEXT), "text-mode", WIRED_CMD(0),
  308.     MODFUNC, "transpose-characters", WIRED_CMD(TransChar),
  309.     MODFUNC, "transpose-lines", WIRED_CMD(TransLines),
  310.     FUNCTION, "unbind-key", WIRED_CMD(UnbindC),
  311.     FUNCTION, "version", WIRED_CMD(ShowVersion),
  312.     FUNCTION, "visible-spaces-in-window", WIRED_CMD(WVisSpace),
  313.     FUNCTION, "visit-file", WIRED_CMD(ReadFile),
  314.     FUNCTION, "window-find", WIRED_CMD(WindFind),
  315. #if defined(ABBREV)
  316.     DefMinor(Abbrev), "word-abbrev-mode", WIRED_CMD(0),
  317.     FUNCTION, "write-word-abbrev-file", WIRED_CMD(SaveAbbrevs),
  318. #endif
  319.     FUNCTION, "write-file", WIRED_CMD(WriteFile),
  320.     FUNCTION, "write-macros-to-file", WIRED_CMD(WriteMacs),
  321.     FUNCTION, "write-modified-files", WIRED_CMD(WtModBuf),
  322.     FUNCTION, "write-region", WIRED_CMD(WrtReg),
  323.     MODFUNC, "yank", WIRED_CMD(Yank),
  324.     MODFUNC, "yank-pop", WIRED_CMD(YankPop),
  325.     FUNCTION, 0, 0
  326. };
  327.  
  328. #if !defined(TXT_TO_C)
  329. data_obj *
  330. findcom(prompt)
  331. char    *prompt;
  332. {
  333.     /* This is for faster startup.  This just reads until a space or a
  334.        tab or a newline character is reached, and then does a
  335.        semi-hashed lookup on that string.  This should be much faster
  336.        than initializing the minibuffer for each line. */
  337.     if (InJoverc) {
  338.         char    cmdbuf[128];
  339.         register const struct cmd    *cmd;
  340.         register char    *cp = cmdbuf;
  341. #if !(defined(IBMPC) || defined(MAC))
  342.         register int    c;
  343. #else
  344.         int c;
  345. #endif
  346.         const struct cmd    *which;
  347.         size_t    cmdlen;
  348.         int    found = 0;
  349.         static const struct cmd    *cmdhash[26];
  350.         static int    beenhere = NO;
  351.  
  352. /* special case for prefix commands--only upper case ones */
  353. #define hash(c)    ((c) - 'a')
  354.  
  355.         /* initialize the hash table */
  356.         if (beenhere == NO) {
  357.             int    lastc = 0;
  358.  
  359.             for (cmd = commands; cmd->Name != 0; cmd++)
  360.                 if (lastc != cmd->Name[0]) {
  361.                     lastc = cmd->Name[0];
  362.                     cmdhash[hash(lastc)] = cmd;
  363.                 }
  364.             beenhere = YES;
  365.         }
  366. #ifdef MAC
  367.         menus_off();    /* Block menu choices during input */
  368. #endif
  369.         /* gather the cmd name */
  370.         while (((c = getch()) != EOF) && !strchr(" \t\r\n", c)) {
  371. #if (defined(IBMPC) || defined(MAC))
  372.             lower((char *) &c);
  373. #else
  374.             if (isupper(c))
  375.                 c = tolower(c);
  376. #endif
  377.             *cp++ = c;
  378.         }
  379.         if (c == EOF)
  380.             return 0;
  381.         *cp = '\0';
  382.         cmdlen = cp - cmdbuf;
  383.         if (cmdlen == 0)
  384.             return 0;
  385.  
  386.         /* look it up (in the reduced search space) */
  387.         if (islower(cmdbuf[0]))
  388.             for (cmd = cmdhash[hash(cmdbuf[0])]; cmd != 0 && cmd->Name[0] == cmdbuf[0]; cmd++) {
  389.             if (strncmp(cmd->Name, cmdbuf, cmdlen) == 0) {
  390.                 if (strcmp(cmd->Name, cmdbuf) == 0)
  391.                     return (data_obj *) cmd;
  392.                 found += 1;
  393.                 which = cmd;
  394.             }
  395.             }
  396.         if (found > 1) {
  397.             complain("[\"%s\" ambiguous]", cmdbuf);
  398.             /* NOTREACHED */
  399.         } else if (found == 0) {
  400.             complain("[\"%s\" unknown]", cmdbuf);
  401.             /* NOTREACHED */
  402.         }else
  403.             return (data_obj *) which;
  404.     } else {
  405.         static char    *strings[(sizeof commands) / sizeof (commands[0])];
  406.         static int    beenhere = NO;
  407.         register int    com;
  408.  
  409.         if (beenhere == NO) {
  410.             register char    **strs = strings;
  411.             register const struct cmd    *c;
  412.  
  413.             for (c = commands; c->Name != 0; c++)
  414.                 *strs++ = c->Name;
  415.             *strs = 0;
  416.             beenhere = YES;
  417.         }
  418.  
  419.         if ((com = complete(strings, prompt, CASEIND)) < 0)
  420.             return 0;
  421.         return (data_obj *) &commands[com];
  422.     }
  423. #undef    hash
  424. }
  425. #endif
  426.